package cn.doit.day03

/*
  伴生类和伴生对象有什么作用
  1.
  2.
  3.
 */
object _01_伴生类和伴生对象 {
  def main(args: Array[String]): Unit = {
    val cat: Cat = new Cat(1, "比鲁斯大人", "紫色")
    //      cat.gender
    //创建对象可以不用new
    val cat1: Cat = Cat.apply(1, "比鲁斯大人", "紫色")
    val cat2: Cat = Cat(1, "比鲁斯大人", "紫色")

    //如果想要访问class里面得东西，就需要去创建对象，然后在调用方法或者属性
    //用类名去调用方法或者属性得时候，也是一样的，访问不到class里面得任何东西


    //    Cat.address
  }

}
//让两个类得类名一样

/**
 * 称class类是object类得伴生类
 * object类是class类得伴生对象
 *
 * 作用：
 * 动静分离
 * 他们可以相互访问对方得私有属性
 * 可以重写两个方法：apply方法（创建对象得时候可以不用new）
 * unapply方法  可以很好得运用于模式匹配
 */
//定义一个class类
class Cat(val id: Int, val name: String, val color: String) {
  private val gender: String = "male"

  def canEat() = {
    println("我喜欢吃鱼！！！")
  }

  //  Cat.address

}

//再定义一个object类
object Cat {
  val age: Int = 2
  val price: Double = 9.9
  private val address: String = "北京中南海"
  val cat: Cat = new Cat(1, "比鲁斯大人", "紫色")
  //  cat.gender

  def apply(id: Int, name: String, color: String): Cat = new Cat(id, name, color)

  //unapply  解构
  def unapply(arg: Cat): Option[(Int, String, String)] = Some(arg.id, arg.name, arg.color)

  def canCatchMouse() = {
    println("我会抓老鼠")
  }
}
